package com.zhss.designpattern.template;

/**
 * 使用了模板方法模式
 *
 * @author zhonghuashishan
 */
public class TemplateMethodPatterDemoPractice {

	public static void main(String[] args) {
		Dicount1 discount1 = new Dicount1();
		discount1.executeDiscount();
		Dicount2 discount2 = new Dicount2();
		discount2.executeDiscount();

	}


	/**
	 * 具体业务对应的的打折规则方法
	 */
	public static class Dicount1 extends AbstractDiscountTemplate{
		@Override
		protected void specialDiscount() {
			System.out.println("这是打折1的计算规则");
		}
	}

	public static class Dicount2  extends AbstractDiscountTemplate{
		@Override
		protected void specialDiscount() {
			System.out.println("这是打折2 的计算规则");
		}
	}

	/**
	 * 定义一个同一的打折接口
	 */
	public interface Discount{
		void executeDiscount();
	}
	/**
	 * 定义一个模板，对于通用的方法抽取出来做为公共方法；对于具体的方法，则定义为模板方法
	 */
	public abstract static class  AbstractDiscountTemplate implements Discount{
		public void executeDiscount() {
			commonDiscount();
			specialDiscount();
		}
		//这里是需要抽取出来的通用计算规则
		protected void commonDiscount(){
			System.out.println("这是通用的打折计算规则");
		}
		//这里是一个抽象的模板方法，需要每个具体的特殊业务去实现.
		//这就是模板方法的精髓所在
		protected abstract void specialDiscount();
	}
}